from common_import import *


def calculate_cross_elasticity():
    # 从Excel文件读取数据，假设文件名为 'data.xlsx'，并且包含10个sheet分别表示2015-2024的数据
    file_path = "data/15-24.xlsx"

    # 创建一个空的数据结构来存储每个作物在各年的数据
    crop_data = {}

    # 读取2015到2020年的数据
    for year in range(2015, 2021):
        # 读取对应年份的sheet
        df = pd.read_excel(file_path, sheet_name=str(year))

        # 对每一行数据（每种作物）进行处理
        for _, row in df.iterrows():
            crop_id = row["作物编号"]
            if crop_id not in crop_data:
                crop_data[crop_id] = {"quantity": [], "price": []}

            # 存储每个作物的预销售量和销售单价
            crop_data[crop_id]["quantity"].append(row["预销售量"])
            crop_data[crop_id]["price"].append(row["销售单价/(元/斤)"])

    # 初始化一个字典来存储交叉弹性
    cross_elasticity = {}

    # 计算每对作物的交叉价格弹性
    for x in crop_data:
        for y in crop_data:
            if x != y:
                # 计算作物x和作物y的平均需求变化率和价格变化率
                delta_Q_x = sum(
                    (q2 - q1) / q1
                    for q1, q2 in zip(
                        crop_data[x]["quantity"][:-1], crop_data[x]["quantity"][1:]
                    )
                ) / len(crop_data[x]["quantity"][:-1])
                delta_P_y = sum(
                    (p2 - p1) / p1
                    for p1, p2 in zip(
                        crop_data[y]["price"][:-1], crop_data[y]["price"][1:]
                    )
                ) / len(crop_data[y]["price"][:-1])

                # 避免除零错误
                if delta_P_y != 0:
                    elasticity = delta_Q_x / delta_P_y
                    cross_elasticity[(x, y)] = elasticity

    # 对结果进行1-sigma异常值处理
    cross_elasticity = handle_outliers(cross_elasticity)

    print(cross_elasticity[max(cross_elasticity)])
    return cross_elasticity


def handle_outliers(data_dict):
    """
    对数据字典中的值进行1-sigma异常值处理
    """
    # 提取字典中的值并转换为Series
    values = pd.Series(list(data_dict.values())).dropna()
    mean = values.mean()  # 计算均值
    std = values.std()  # 计算标准差
    upper_limit = mean + std  # +1-sigma
    lower_limit = mean - std  # -1-sigma

    # 使用1-sigma原则替换异常值
    handled_data = {
        k: min(max(v, lower_limit), upper_limit) for k, v in data_dict.items()
    }
    return handled_data


if __name__ == "__main__":
    calculate_cross_elasticity()

# # 从Excel文件读取数据，假设文件名为 'data.xlsx'，并且包含10个sheet分别表示2015-2024的数据
# file_path = "data/15-24.xlsx"

# # 创建一个空的数据结构来存储每个作物在各年的数据
# crop_data = {}

# # 读取2015到2020年的数据
# for year in range(2015, 2021):
#     # 读取对应年份的sheet
#     df = pd.read_excel(file_path, sheet_name=str(year))

#     # 对每一行数据（每种作物）进行处理
#     for _, row in df.iterrows():
#         crop_id = row["作物编号"]
#         if crop_id not in crop_data:
#             crop_data[crop_id] = {"quantity": [], "price": []}

#         # 存储每个作物的预销售量和销售单价
#         crop_data[crop_id]["quantity"].append(row["预销售量"])
#         crop_data[crop_id]["price"].append(row["销售单价/(元/斤)"])

# # 获取所有作物编号，用于构建矩阵
# crop_ids = sorted(crop_data.keys())

# # 初始化一个空的数据框来存储交叉弹性矩阵
# cross_elasticity_matrix = pd.DataFrame(index=crop_ids, columns=crop_ids)

# # 计算每对作物的交叉价格弹性
# for x in crop_ids:
#     for y in crop_ids:
#         if x != y:
#             # 计算作物x和作物y的平均需求变化率和价格变化率
#             delta_Q_x = sum(
#                 (q2 - q1) / q1
#                 for q1, q2 in zip(
#                     crop_data[x]["quantity"][:-1], crop_data[x]["quantity"][1:]
#                 )
#             ) / len(crop_data[x]["quantity"][:-1])
#             delta_P_y = sum(
#                 (p2 - p1) / p1
#                 for p1, p2 in zip(crop_data[y]["price"][:-1], crop_data[y]["price"][1:])
#             ) / len(crop_data[y]["price"][:-1])

#             # 避免除零错误
#             if delta_P_y != 0:
#                 elasticity = delta_Q_x / delta_P_y
#                 cross_elasticity_matrix.loc[x, y] = elasticity
#             else:
#                 cross_elasticity_matrix.loc[x, y] = None  # 用None表示不可计算的情况

# # 将对角线的值设置为None，因为自身对自身没有意义
# for crop_id in crop_ids:
#     cross_elasticity_matrix.loc[crop_id, crop_id] = None

# # 输出交叉弹性矩阵
# print("作物之间的交叉弹性矩阵：")
# print(cross_elasticity_matrix)
